package com.tarena.rabbitmq.test;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 在这个测试类中,构建我们想要的各种关系的组件声明
 */
public class DemoDeclare {
    //需要连接对象
    private Connection connection;
    @Before
    public void init(){
        ConnectionFactory factory=new ConnectionFactory();
        //配置当前rabbitmq的连接属性
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("guest");//guest 只能使用 localhost识别
        factory.setPassword("guest");
        factory.setVirtualHost("/");
        try {
            connection=factory.newConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //声明队列
    @Test
    public void queueDeclare() throws IOException {
        Channel channel = connection.createChannel();
        //1 声明一下所需的队列组件 或 交换机组件 如果不声明(创建) 消费者没有可以连接监听的队列资源 404
        /*
         * queue: 字符串队列名称 同一个虚拟主机只能有一个名字
         * durable: 是否持久化 如果不持久化(false) rabbitmq重启字后 队列丢失了
         * exclusive: 是否独占专属,如果不专属(fasle) 任何连接的消费者都可以监听消费
         * autoDelete: 是否自动删除,如果队列没有消费者(消费者断开了连接)是否自动删除队列
         * arguments: map格式的队列其他的参数 比如队列最大长度 队列的消息最大存活时间
         */
        Map<String,Object> args=new HashMap<>();
        args.put("x-expires",10000);
        channel.queueDeclare("queue01",false,false,true,args);

    }
    //声明交换机
    @Test
    public void exchangeDeclare() throws IOException {
        //声明交换机 direct类型
        Channel channel = connection.createChannel();
        /*
            exchange: 声明的交换机名字
            type: 声明的交换机的类型 direct fanout topic headers 使用别的类型会出错
         */
        channel.exchangeDeclare("topic-ex01","topic",false,false,null);
    }
    //绑定队列和交换机
    @Test
    public void bindQueue() throws IOException {
        //将现有的3个队列按照我们的约定 绑定自定义交换机
        Channel channel = connection.createChannel();
        //声明绑定关系 queue01 北京 queue02 上海 queue03 天津
        channel.queueBind("queue01","topic-ex01","中国.#");
        channel.queueBind("queue02","topic-ex01","*.上海.*");
        //channel.queueBind("queue03","topic-ex01","天津");
    }

}
